package com.java.jvm.loader;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
/**
 * 自定义类加载器
 */
public class SimpleAppClassLoader extends ClassLoader{
    /**基础路径*/
    private String baseDir;
    public SimpleAppClassLoader(String baseDir){
        this.baseDir=baseDir;
    }
    /**
     * @param name 这里的参数为类全名(pkg.Hello)
     * @return 类成功加载后生成的字节码对象。
     * @throws ClassNotFoundException
     */
    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        System.out.println("name="+name);
        //1.基于包名类名找到对应的类
        String classPath=baseDir+name.replace(".", "\\")+".class";
        //2.读取类
        FileInputStream in=null;
        try {
            in = new FileInputStream(classPath);
            byte[]buf=new byte[in.available()];//in.available()返回流中有效字节个数
            int len=in.read(buf);
            //3.校验类并创建字节码对象
            return defineClass(name, buf, 0, len);
        }catch (IOException e){
            e.printStackTrace();
            return null;
        }finally {
            if(in!=null)try{in.close();}catch (Exception e){}
        }
    }
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
         String baseDir="E:\\TCGBIV\\DEVCODES\\jht\\";
         SimpleAppClassLoader classLoader=new SimpleAppClassLoader(baseDir);
         //这里加载类时会执行类加载器中的findClass方法，同时会把loadClass方法中的实际参数传递給findClass方法
         Class<?> cls=classLoader.loadClass("pkg.Hello");
         //基于字节码对象创建对象实例
         Object h=cls.newInstance();
    }
}
